/*
   FieldVis - A Tool for Visualizing Astrophysical Magnetohydrodynamic Flow
   
   Copyright (C) 2006 - 2008     FieldVis Development Team
  
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
  
   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

   File        : Mutex.h
   Author      : Jeremy Moc  (mocj@msi.umn.edu)

   Description : Data structures to allow RAII access to the pthread mutex.   
*/

#ifndef  MUTEX_H
#define  MUTEX_H

#ifdef WIN32
#include <windows.h>

class Mutex
{
public:

   Mutex()        { InitializeCriticalSection(&cs); }
   
   ~Mutex()       { DeleteCriticalSection(&cs); }
   
   void lock()    { EnterCriticalSection(&cs); }
 
   void unlock()  { LeaveCriticalSection(&cs); }
 
private:

   CRITICAL_SECTION cs;
};

#else
#include <pthread.h>
 
class Mutex
{
public:

   Mutex()        { pthread_mutex_init(&m, 0); }
   
   void lock()    { pthread_mutex_lock(&m); }
 
   void unlock()  { pthread_mutex_unlock(&m); }
 
private:

   pthread_mutex_t m;
};

#endif

class MutexLock
{
public:

   MutexLock(Mutex& pm): m(pm)   { m.lock(); }

   ~MutexLock()                  { m.unlock(); }

private:

   Mutex &m;
};

#endif
